#include <stdio.h>
#include <string.h>
#include <cstdlib>
//顺序表
#define MAX_SIZE 100 // 顺序表最大长度
typedef int ElementType; // 元素类型 (typedef作用是起别名)

typedef struct {
    ElementType data[MAX_SIZE]; // 顺序表数据 == int data[100];(长度为100的数组)
    int length; // 当前长度
} SeqList;

int InitList(SeqList *L) { // 初始化顺序表
    L->length = 0; // 初始化顺序表长度
    return 1; // 初始化成功
}

int addpendElement(SeqList *L, ElementType e) {    // 在顺序表末尾添加元素
    if (L->length >= MAX_SIZE) { // 顺序表已满
        printf("顺序表已满，无法添加元素\n");
        return 0; // 添加失败
    }
    L->data[L->length] = e; // 在末尾添加元素
    L->length++; // 长度加1
    return 1; // 添加成功
}

void listPrint(SeqList *L) { // 打印顺序表元素
    for (int i = 0; i < L->length; i++) {
         printf("当前列表元素第%d个元素为:%d\n", i+1, L-> data[i]);
    }
}

int insertElement(SeqList *L, int position, ElementType e) { // 在顺序表的指定位置插入元素
    if (L->length >= MAX_SIZE) { // 顺序表已满
        printf("顺序表已满，无法插入元素\n");
        return 0; // 插入失败
    }
    if (position < 1 || position > L->length + 1) { // 插入位置不合法
        printf("插入位置不合法\n");
        return 0; // 插入失败
    }
    for (int i = L->length - 1; i >= position - 1; i--) { // 从前向后移动元素
        L->data[i+1] = L->data[i];
    }
    L->data[position - 1] = e; // 插入元素
    L->length++; // 长度加1
    printf("插入元素成功，当前长度为：%d\n", L->length);
    return 1; // 插入成功
}

int deleteElement(SeqList *L, int position) { // 删除顺序表的指定位置元素
    if (L->length == 0) { // 顺序表为空
        printf("顺序表为空，无法删除元素\n");
        return 0; // 删除失败
    }
    if (position < 1 || position > L->length) { // 删除位置不合法
        printf("删除位置不合法\n");
        return 0; // 删除失败
    }
    for (int i = position; i < L->length; i++) { // 从后向前移动元素
        L->data[i-1] = L->data[i];
    }
    L->length--; // 长度减1
    printf("删除元素成功，当前长度为：%d\n", L->length);
    return 1; // 删除成功
}

int findElement(SeqList *L, ElementType e) { // 查找顺序表中的元素
    for (int i = 0; i < L->length; i++) {
        if (L->data[i] == e) {
            return i + 1; // 返回元素位置（从1开始）
        }
    }
    return 0; // 未找到元素
}

int main(){
    SeqList list; // 声明一个顺序表
    InitList(&list); // 初始化顺序表
    printf("顺序表初始化成功，当前长度为：%d\n", list.length);
    printf("顺序表的最大长度为：%d\n", MAX_SIZE);
    printf("当前占用内存字节为：%zu\n", sizeof(list.data));
    addpendElement(&list, 10);
    addpendElement(&list, 20);
    addpendElement(&list, 30);
    addpendElement(&list, 40);
    addpendElement(&list, 50);
    listPrint(&list);
    insertElement(&list, 3, 25); // 在第3个位置插入25
    listPrint(&list);
    deleteElement(&list, 3); // 删除第3个位置元素
    listPrint(&list);
    int pos = findElement(&list, 40);
    if (pos) {
        printf("找到元素40，位置为：%d\n", pos);
    } else {
        printf("未找到元素40\n");
    }
    return 0;
}
